package store.lunangangster.nodeflow.core.component;

import com.alibaba.ttl.TransmittableThreadLocal;
import store.lunangangster.nodeflow.rt.DataBus;
import store.lunangangster.nodeflow.rt.Slot;

/**
 * <h2>基础Node抽象类</h2>
 *
 * @author cwk
 * @version 1.0
 */
public abstract class NodeComponent {

	private static final ThreadLocal<Integer> SLOT_INDEX_TL = new TransmittableThreadLocal<>();

	public abstract void process();

	/**
	 * 获取当前线程对应的Slot
	 * @return Slot对象
	 */
	public Slot getSlot() {
		return DataBus.getSlot(SLOT_INDEX_TL.get());
	}

	/**
	 * 设置当前线程所占Slot槽
	 * @param slotIndex	设置对应的执行槽
	 */
	public void setSlot(Integer slotIndex) {
		SLOT_INDEX_TL.set(slotIndex);
	}

	/**
	 * 清除当前线程的SlotTL
	 */
	public void removeSlotTl() {
		SLOT_INDEX_TL.remove();
	}

	/**
	 * 当前对象为IfComponent时，获取当前线程中的ResultKey
	 * @return IfResultKey
	 */
	public String getIfResultKey() { return null; }

	/**
	 * 当前对象为LoopComponent时，获取当前线程中的LoopTimesKey
	 * @return LoopTimesKey
	 */
	public String getLoopTimesKey() { return null; }

	/**
	 * 当前对象为WhileComponent时，获取当前线程中的WhileTimesKey
	 * @return WhileEnterKey
	 */
	public String getWhileEnterKey() { return null; }

	/**
	 * 当前对象为ExitComponent时，获取当前线程中的ExitResultKey
	 * @return ExitResultKey
	 */
	public String getExitResultKey() { return null; }

	/**
	 * 当前对象为SwitchComponent时，获取当前线程中的SwitchResultKey
	 * @return SwitchResultKey
	 */
	public String getSwitchResultKey() { return null; }

	/**
	 * 移除IfResultKey
	 */
	public void removeIfResultKey() {}

	/**
	 * 移除LoopTimesKey
	 */
	public void removeLoopTimesKey() {}

	/**
	 * 移除WhileEnterKey
	 */
	public void removeWhileEnterKey() {}

	/**
	 * 移除ExitResultKey
	 */
	public void removeExitResultKey() {}

	/**
	 * 移除SwitchResultKey
	 */
	public void removeSwitchResultKey() {}
}
